const fs = require('fs');

/* fs.readFile('./data/a.txt','utf8',(err,data)=>{
    if (err) {
        throw err;
    }

    console.log(data);
});


fs.readFile('./data/b.txt','utf8',(err,data)=>{
    if (err) {
        throw err;
    }

    console.log(data);
});


fs.readFile('./data/c.txt','utf8',(err,data)=>{
    if (err) {
        throw err;
    }

    console.log(data);
}); */


// 多个并列的异步操作   执行顺序是不确定的 ， 但是如果想要按照他们的先后顺序执行，就必须嵌套。


/* fs.readFile('./data/a.txt','utf8',(err,data)=>{
    if (err) {
        throw err;
    }

    console.log(data);

    fs.readFile('./data/b.txt','utf8',(err,data)=>{
        if (err) {
            throw err;
        }
    
        console.log(data);

        fs.readFile('./data/c.txt','utf8',(err,data)=>{
            if (err) {
                throw err;
            }
        
            console.log(data);
        });
        
    });
    
}); */

// 如上所示 想要按照顺序执行异步操作 就得嵌套 嵌套多了 就是 callback hell;

// Promise 内部是一个异步任务 

// es6 Promise 构造函数

// 使用promise
// 1 - 创建一个 promise 容器 就是实例
let p1 = new Promise((resolve,reject)=>{
    fs.readFile('./data/a.txt','utf8',(err,data)=>{
        if (err) {

            // 如果错误 把容器的状态改变为 pending -> rejected
            reject(err);

        } else {

            // 如果成功 就把容器的状态 pending -> resolved
            resolve(data);

        }

    });
});

// 读多文件

let p2 = new Promise((resolve,reject)=>{
    fs.readFile('./data/b.txt','utf8',(err,data)=>{
        if (err) {

            // 如果错误 把容器的状态改变为 pending -> rejected
            reject(err);

        } else {

            // 如果成功 就把容器的状态 pending -> resolved
            resolve(data);

        }

    });
});


// 读多文件

let p3 = new Promise((resolve,reject)=>{
    fs.readFile('./data/c.txt','utf8',(err,data)=>{
        if (err) {

            // 如果错误 把容器的状态改变为 pending -> rejected
            reject(err);

        } else {

            // 如果成功 就把容器的状态 pending -> resolved
            resolve(data);

        }

    });
});

// p1 就是一个承诺  p1完成之后 然后做什么
// 同样的 想要按照顺序执行 p1  p2  p3 ，需要在 then 函数中 return 接下来需要执行的 第二个 promise 容器
// 

p1
    .then((data)=>{ // 这里就是 上边的 resolve 方法
        console.log(data);

        // 在这里 return 第二个需要执行的 promise 容器
        
        return p2; 
        // 这里return出去的已不再是容器 p2 ，返回的是p2的 resolve 

    },(err)=>{ // 这里是 上边的 reject 方法
        console.log('读取文件失败',err);
    })
    .then((data)=>{
        // 这里的 data 接收 上边 return 出来的 promise容器的 resolve  

        console.log(data);

        // 同样的 想要继续执行第三个异步   就在这里return 第三个 promise 容器 的 resolve

        return p3;

    })
    .then ((data)=>{
        // 这里 执行p3 的 resolve 方法
        console.log(data);
    })
